package controlador;

import java.util.*;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.*;
import java.io.ObjectInputStream.GetField;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import controlador.ControlFacturaV.KeyL;

import modelo.*;
import vista.FormProducto;
public class ControlProducto implements ActionListener{
	
	private FormProducto formprod;
	private int  n = 0;
	private int c = 0;
	
	public ControlProducto()
	{
		super();
		this.formprod = new FormProducto();
		this.formprod.addListener(this);
		this.formprod.setVisible(true);
		formprod.setLocationRelativeTo(null);
		new KeyL();
		Ini();
	}
	
	public class KeyL implements KeyListener
	{
		public KeyL()
		{
			formprod.addKeyListener(this);
		}
		public void keyPressed(KeyEvent k){}
		public void keyReleased(KeyEvent k){}
		public void keyTyped(KeyEvent k)
		{
			if(!(k.getKeyChar() >= '0' && k.getKeyChar() <= '9'))
				k.consume();
		}
	}
	
	public void Ini()
	{
		CargarCombo();
		CargarComboIngrediente();
		formprod.Settxtcodprod("");
		formprod.Settxtdescripcion("");
		formprod.Settxtpreciou("");
		formprod.SetcomboCategoria(-1);
		formprod.SetcomboIngredientes(-1);
		formprod.Settxtcantidad(0);
		formprod.EnabledBntEliminar(false);
		formprod.VaciarDatos();
		formprod.Gettxtdescripcion().enable(false);
		formprod.Gettxtpreciou().enable(false);
		formprod.GetcomboCategoria().enable(false);
		formprod.GetcomboIngredientes().enable(false);
		formprod.EnabledBntGuardar(false);
		List<Object>L = new ArrayList();
		L.add("");
		L.add("");
		formprod.Anadir(L);
	}
	
	/******************* METODOS DE CARGAR COMBOS *********************/
	public void CargarCombo()
	{
		try
		{
			String Items = "";
			ProductoDAO DAO = new ProductoDAO();
			
			ResultSet registro = DAO.BuscarCategoria();
		
			while(registro.next())
				Items += registro.getString("descripcion") + ",";

			formprod.SetcomboCategoria(Items);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	public void CargarComboIngrediente()
	{
		try
		{
			String Items = "";
			
			ProductoDAO DAO = new ProductoDAO();
			
			ResultSet registro = DAO.BuscarIngredientes();
		
			while(registro.next())
				Items +=  registro.getString("nombre") + ",";

			formprod.SetcomboIngredientes(Items);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	/******************* METODOS DE BUSQUEDA *********************/
	public boolean BuscarProducto(boolean most)
	{
		try
		{
			ProductoDAO DAO = new ProductoDAO();
			
			ResultSet registro = DAO.BuscarIngredientes();
			
			registro = DAO.BuscarProducto(formprod.Gettxtcodprod().getText());
		
    		if(registro.next())
    		{
    			String codproducto = registro.getString("codproducto");
				String descripcion = registro.getString("descripcion");
				Float preciou = registro.getFloat("preciou");
				Integer codcategoria = registro.getInt("codcategoria");
				Producto producto = new Producto(codproducto, descripcion, preciou,codcategoria);
				formprod.Settxtcodprod(codproducto);
				formprod.Settxtdescripcion(descripcion);
				formprod.Settxtpreciou(preciou.toString());
				formprod.SetcomboCategoria(codcategoria);
				formprod.Gettxtdescripcion().enable(true);
				formprod.Gettxtpreciou().enable(true);
				formprod.GetcomboCategoria().enable(true);
				formprod.GetcomboIngredientes().enable(true);
				formprod.EnabledBntGuardar(false);
				formprod.EnabledBntEliminar(true);
				return true;
    		}
    		else
    		{
    			if(most)
    			{
    				formprod.mostrarMensaje("El producto " + formprod.Gettxtcodprod().getText() +" no esta registrado!");
    			}
    			return false;
    		}
		}
		catch (SQLException f) {
			f.printStackTrace();
		}
		return false;
	}
	
	public boolean BuscarIngrediente(boolean most)
	{
		if(BuscarProducto(true))
		{
			try
			{
				ProductoDAO DAO = new ProductoDAO();
				
				ResultSet registro = DAO.BuscarProductoIngrediente(formprod.Gettxtcodprod().getText());

				if(registro.next())
	    		{
					do {
	    			String codingrediente = registro.getString("codingrediente");
	    			String codproducto = registro.getString("codproducto");
					Float cantidadingrediente = registro.getFloat("cantidadingrediente");
					List<Object>L = new ArrayList();
					L.add(ConvertirCodigo(codingrediente));
					L.add(cantidadingrediente);
					formprod.Anadir(L);
					} while (registro.next());
					return true;
	    		}
	    		else
	    		{
	    			if(most)
	    			{
	    				formprod.mostrarMensaje("El listado de ingredientes del producto " + formprod.Gettxtcodprod().getText() +" no esta registrado!");
	    			}
	    			return false;
	    		}
			}
			catch (SQLException f) {
				f.printStackTrace();
			}
			return false;
		}
		return false;
	}
	
	private String BuscarCodigo(String str)
	{
		try
		{
			ProductoDAO DAO = new ProductoDAO();
			ResultSet registro = DAO.BuscarIngrediente(str);
	
			if(registro.next())
				return registro.getString("codingrediente");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return "";
	}
	
	/******************* METODOS DE CONVERTIR *********************/
	private String ConvertirCodigo(String cod)
	{
		try
		{
			ProductoDAO DAO = new ProductoDAO();
			ResultSet registro = DAO.BuscarIngredienteporCodigo(cod);

			if(registro.next())
				return registro.getString("nombre");
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		return "";
	}
	
	/******************* METODOS GUARDAR *********************/
	public void GuardarProducto_I(){
		ProductoDAO DAO = new ProductoDAO();
		if(BuscarProducto(false))
			formprod.mostrarMensaje("Ya existe un producto con este código!");
		else
		{
    		Producto producto= new Producto
    		(formprod.Gettxtcodprod().getText(),
    		formprod.Gettxtdescripcion().getText(),
    		Float.parseFloat(formprod.Gettxtpreciou().getText()),
    		formprod.GetcomboCategoria().getSelectedIndex());
    		
    		int t = formprod.N_Elementos();
    		if(t != 0 && !formprod.Gettxtcodprod().getText().equals(""))
    		{
    			
    			DAO.RegistrarProducto(producto.getCodproducto(),producto.getDescripcion(),producto.getPreciou().toString(),producto.getCodcategoria().toString());
	    		
	    		Object DATOS[][] = formprod.GetDatos();
				
				for(int i = 0;i < t;i++)
	    			DAO.RegistrarProductoIngrediente(BuscarCodigo(DATOS[i][0].toString()),formprod.Gettxtcodprod().getText(),Float.parseFloat(DATOS[i][1].toString()));

	    		formprod.mostrarMensaje("Producto con sus ingredientes registrado con éxito!");
	    		this.Ini();
    		}
    		else formprod.mostrarMensaje("Faltan datos por cargar!");
    	}
	}
	
    public void actionPerformed(ActionEvent e)
    {
    	if (e.getActionCommand().equals("B"))
    	{
    		 BuscarProducto(true);
    		 BuscarIngrediente(true);
		}
    	else if (e.getActionCommand().equals("I"))
    	{
			if(formprod.GetcomboIngredientes().getSelectedIndex() == -1)
				formprod.mostrarMensaje("Seleccione un ingrediente!");
		    else if(Float.parseFloat(formprod.getTxtcantidad().getText())>0)
			{
				List<Object>L = new ArrayList();
				L.add(formprod.GetcomboIngredientes().getItemAt(formprod.GetcomboIngredientes().getSelectedIndex()));
				L.add(formprod.getTxtcantidad().getText());
				formprod.Anadir(L);
			}
			else formprod.mostrarMensaje("Ingrese una cantidad valida!");
    	}
    	else if (e.getActionCommand().equals("Guardar"))
    		GuardarProducto_I();
		else if (e.getActionCommand().equals("Eliminar"))
		{
			ProductoDAO DAO = new ProductoDAO();
			DAO.EliminarProducto(formprod.Gettxtcodprod().getText());
			
			formprod.mostrarMensaje("Producto Eliminado con éxito!");
			Ini();
		}
		else if(e.getActionCommand().equals("Cancelar"))
		{
			Ini();
		}
		else if(e.getActionCommand().equals("S"))
		{
			formprod.dispose();	
		}
		
	}

}
